<?php

namespace Observer\Subject;

include_once "Observers/ObserverInterface.php";

use Observer\Observers\ObserverInterface;
/** 抽象通知者 */
class SubjectAbstract
{
    /** @var array 存储具体观察者对象实例 */
    private array $observers = [];

    /**
     * 增加观察者
     * @param ObserverInterface $observer
     * @return void
     */
    public function attach(ObserverInterface $observer)
    {
        $this->observers[] = $observer;
    }

    /**
     * 移除观察者
     * @param ObserverInterface $observer
     * @return void
     */
    public function detach(ObserverInterface $observer)
    {
        if (($key = array_search($observer, $this->observers))) {
            unset($this->observers[$key]);
        }
    }

    /**
     * 通知观察者
     * @return void
     */
    public function notify()
    {
        if (!empty($this->observers)) {
            foreach ($this->observers as $observer) {
                $observer->update();
            }
            return ;
        }
        echo "没有需要通知的观察者" . PHP_EOL;
    }
}